#!/usr/bin/python
# -*- coding: utf-8 -*-

import numpy, tempfile, subprocess, wave, array, os
from marshal import *
import subprocess
import tempfile
import mimetypes

class CacheMessage:
	def __init__(self, chemin, message):
		print message
		nvnom = ''
		for i in chemin :
			if i == '.' :
				nvnom+='mod'
				nvnom+=i
				
		if os.path.exists(chemin) :
			frames_total, chan, nb_frames, width, sample = self.Conversion(chemin)

		fshape=frames_total.shape

		chaine=''
		clef=[]
	
		for caractere in message :
			ctemp=self.bine(ord(caractere))
			chaine+=str(ctemp)
			clef.append(len(ctemp))
	
	
		print chaine
		print clef
	
		if fshape<(len(chaine),) :
			print "impossible de crypter le message (trop long) ! "
		else :
			print "insertion du message dans la musique, veuillez patienter "
	
		compteur = 0	
	
		for i in  chaine :
			if self.poids(frames_total[compteur,]) != int(i) :
				frames_total[compteur,]=frames_total[compteur,]+1
			compteur+=1
		nomNouvFich = '.'.join(chemin.split('.')[:-1])
		nomNouvFich += "(stegano)" 
		dd=open(nomNouvFich + '.cle', 'wb')
		dump(clef,dd)
		dd.close()
	
		song=wave.open(nomNouvFich + '.wav','wb')
		song.setsampwidth(width)
		song.setnframes(nb_frames)
		song.setnchannels(chan)
		song.setframerate(sample)
		song.writeframes(frames_total)
		song.close()
		print "Le message est cache dans la musique !"
		
		
	def Conversion (self, fichier = ''):
	
		fichIsTmp = False
		#si le fichier n'est pas en wav, on le decompresse	
		#if mimetypes.guess_type(fichier)[0] != mimetypes.types_map[".wav"] :
		# creation d'un fichier temporaire
		temp = tempfile.NamedTemporaryFile(prefix='steganoMsg')
		# preparation de la commande de decompression ffmpeg
		comande=[
			'ffmpeg',
			'-i',  fichier,
			'-vn',
			'-y',
			'-ar', '10000',
			'-ac', '1',
			'-f',   'wav',
			temp.name
			]
		# execution de la commande
		subprocess.check_output(comande, stderr=subprocess.STDOUT)
		""" si la decompression est correcte, on remplace le fichier courant 
		par le fichier temporaire decompresse """
		fichIsTmp = True
		fichier = temp.name
	
		#on extrait les donnees dont on a besoin
		song=wave.open(fichier,'rb')
		nb_frames=song.getnframes()
		samplerate=song.getframerate()
		all_frames=song.readframes(nb_frames)
		tab_frames=array.array("h",all_frames)
		del all_frames
		frames_total = numpy.array(tab_frames,numpy.int16)
		del tab_frames
		channel=song.getnchannels()
		swidth=song.getsampwidth()
		song.close()
		if fichIsTmp :
			#on detruit le fichier temporaire
			temp.close()
		return frames_total, channel, nb_frames, swidth, samplerate


	def poids(self, n):
		return n & 1


	def bine(self, n):
		# conversion en binaire
		cv = []
		while n > 0:
			cv.insert(0, str(int(n % 2)))
			n = n // 2
		return "".join(cv)


	


	

